package logs;

import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;

/**
 * Klasa logera. Przechowuje logi w kontenerze i zapisuje do pliku.
 * 
 * @author mmskrzyp
 * @todo ustalic sposob logowania zdarzen
 * @todo obsłużyć mapę loggerów i zmienić trochę konstruktory tak, aby najpierw sprawdzały czy istnieje dany logger na liście.
 * @todo dokumentacja javadocs
 */
public class Logger {
    private static Logger instance = null;
    private HashMap<String,ArrayList<Log>> loggers = new HashMap<String, ArrayList<Log>>();
    
    //kontener logów
    private LinkedList<Log> logs;
    private String file_name;
    
    /**
     * Funckja zwraca instację Loggera zasymilowaną z plikiem.
     * @param filename
     * @return Logger
     */
    public static Logger getLogger(String filename){
        if(Logger.instance == null){            
            return new Logger(filename);
        } else {
            return Logger.instance;
        }      
    }
    
    /**
     * 
     */
    private Logger() {
        logs=new LinkedList<Log>();
        file_name="logs";
    }
    
    /**
     * 
     * @param file 
     */
    private Logger(String file) {
        logs=new LinkedList<Log>();
        file_name=file;
    }
    
    /**
     * 
     * @param l 
     */
    public void addLog(Log l) {
        logs.addLast(l);
    }
    
    /**
     * 
     * @return 
     */
    public LinkedList<String> getAll() {
        LinkedList<String> all = new LinkedList<String>();
        Iterator i = logs.iterator();
        while(i.hasNext())
            all.addLast(i.next().toString());
        return all;
    }
    
    /**
     * 
     */
    public void toFile() {
        this.toFile(file_name);
    }
    
    /**
     * 
     * @param file 
     */
    public void toFile(String file) {
        String endl=System.getProperty("line.separator");
        Iterator i = logs.iterator();
        try{
            FileWriter writer = new FileWriter(file + ".log",true); //true oznacza mozliwosc dopisywania
            while(i.hasNext()){
                writer.write(i.next().toString() + endl);
                writer.close();
            }
        } catch(IOException e) {} //tutaj moze mój wyjątek? albo konwersja w bloku catch?
    }
}
